package com.oceansoft.core.common.util;

import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;

import javax.servlet.http.HttpServletRequest;

import net.sf.json.JSONArray;
import net.sf.json.JSONObject;

import org.springframework.ui.ModelMap;

import com.hui.platform.system.utility.DatetimeUtil;
import com.hui.platform.system.utility.StringUtil;
import com.oceansoft.core.common.constant.Constant;

public class RequestUtil {

	
	@SuppressWarnings("unchecked")
	public static void setModelMap(HttpServletRequest request,ModelMap model)
	{
		Map<?, ?> mp = request.getParameterMap(); // 获取客户端传递过来的所有参数
		Set<String> keySet = (Set<String>) mp.keySet();
		for (String name : keySet) {
			String paramName = name;
			//String paramValue = (String)mp.get(paramName);
			String p =  request.getParameter(paramName);
			model.addAttribute(paramName, p);
		}
	}
	
	public static Map<String, String> buildParamsByNamesFromRequest(
			HttpServletRequest request) {
		Map<?, ?> mp = request.getParameterMap(); // 获取客户端传递过来的所有参数
		@SuppressWarnings("unchecked")
		Set<String> keySet = (Set<String>) mp.keySet();
		HashMap<String, String> result = new HashMap<String, String>();
		for (String name : keySet) {
			String paramName = name;
			String paramValue = null;
			if (name.indexOf("|") > 0) {
				String[] nameValue = name.split("[|]");
				paramName = nameValue[0];
				paramValue = nameValue[1];
			}
			String nameObject = request.getParameter(paramName);
			if (paramName.startsWith("Q_")) {
				paramName = paramName.substring(2);
				if (StringUtil.isNotNull(nameObject)) {
					
					
					
					if(paramName.endsWith("_start")||paramName.endsWith("_end"))
					{
						if(paramName.endsWith("_start"))
						{
							result.put(paramName+"_dbopt", ">=");
						}
						else
						{
							result.put(paramName+"_dbopt", "<=");
						}
						
						//paramName = paramName.substring(0,paramName.length()-2);
						
						
						toDBMap4Oracle(result, paramName, nameObject);
						
						
					}
					else
					{
						if(paramName.endsWith("_dbopt")&&nameObject.equals("!"))
						{
							result.put(paramName, "!=");
						}
						else
						{
							result.put(paramName, nameObject.trim());
						}
					}
					
					
				} else {
					if (paramValue != null)
						result.put(paramName, paramValue.trim());
				}
			}

		}
		return result;
	}
	
	public static Object getEntity(HttpServletRequest request, Class<?> c) {
		Map<?, ?> mp = request.getParameterMap(); // 获取客户端传递过来的所有参数
		Object entityObj = null; // 定义一个Object类，最终将返回他
		try {
			entityObj = c.newInstance(); // 实例化entityObj，类型为参数2
			Method[] methods = c.getDeclaredMethods(); // 获取该类中定义的所有方法
			for (Method m : methods) { // 遍历这个方法数组
				if (m.getParameterTypes().length > 0
						&& m.getName().startsWith("set")) { // 找出里面所有的set方法，准备赋值

					String mapKey = m.getName().substring(3).toUpperCase(); // 获取map的key值，即request过来的参数名称
					Object mapValues = mp.get(mapKey) == null ? mp.get(mapKey
							.toLowerCase()) : mp.get(mapKey); // 获取参数的值

					if (mapValues != null) { // 如果参数不等于空
						String parameter = StringUtil
								.arrayToCommaDelimitedString((String[]) mapValues); // 取出参数
						// System.out.println("method :"+m
						// +"	parameter:"+parameter);
						setValue2Method(m, entityObj, parameter);
					}
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return entityObj; // 返回对象
	}

	/**
	 * 将request中的对象set 到domain
	 * 
	 * @param request
	 * @param c
	 * @return
	 * @deprecated
	 */
	@SuppressWarnings("rawtypes")
	@Deprecated
	public static Object getEntity(HttpServletRequest request, Class<?> c,
			String prefix) {
		Map<?, ?> mp = request.getParameterMap(); // 获取客户端传递过来的所有参数
		Object entityObj = null; // 定义一个Object类，最终将返回他
		try {
			entityObj = c.newInstance(); // 实例化entityObj，类型为参数2
			Method[] methods = c.getDeclaredMethods(); // 获取该类中定义的所有方法
			Iterator it = mp.keySet().iterator();
			while (it.hasNext()) {
				String mapKey = it.next().toString();
				if (mapKey.startsWith(prefix)) {
					Object mapValues = mp.get(mapKey); // 获取参数的值
					if (mapValues == null) {
						continue;
					}
					String parameter = StringUtil
							.arrayToCommaDelimitedString((String[]) mapValues);// ((String[])mapValues)[0];
					// //取出参数
					for (Method m : methods) { // 遍历这个方法数组
						if (m.getParameterTypes().length > 0
								&& m.getName().startsWith("set")) { // 找出里面所有的set方法，准备赋值
							String methodName = m.getName().substring(3);// 获取类里方法名

							if (methodName.equalsIgnoreCase(mapKey
									.substring(prefix.length() + 1))) {

								setValue2Method(m, entityObj, parameter);
							}
						}
					}
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return entityObj; // 返回对象
	}

	/**
	 * 将request中的对象set 到domain
	 * 
	 * @param request
	 * @param c
	 * @return
	 * @deprecated
	 */
	@SuppressWarnings("rawtypes")
	@Deprecated
	public static Object getEntityIgnoreCase(HttpServletRequest request,
			Class<?> c) {
		Map<?, ?> mp = request.getParameterMap(); // 获取客户端传递过来的所有参数
		Object entityObj = null; // 定义一个Object类，最终将返回他
		try {
			entityObj = c.newInstance(); // 实例化entityObj，类型为参数2
			Method[] methods = c.getDeclaredMethods(); // 获取该类中定义的所有方法
			Iterator it = mp.keySet().iterator();
			while (it.hasNext()) {
				String mapKey = it.next().toString();
				Object mapValues = mp.get(mapKey); // 获取参数的值
				if (mapValues == null) {
					continue;
				}
				String parameter = StringUtil
						.arrayToCommaDelimitedString((String[]) mapValues);// ((String[])mapValues)[0];
				// //取出参数
				for (Method m : methods) { // 遍历这个方法数组
					if (m.getParameterTypes().length > 0
							&& m.getName().startsWith("set")) { // 找出里面所有的set方法，准备赋值
						String methodName = m.getName().substring(3);// 获取类里方法名

						if (methodName.equalsIgnoreCase(mapKey)) {

							setValue2Method(m, entityObj, parameter);
						}
					}
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return entityObj; // 返回对象
	}

	/**
	 * 将request中的对象set 到domain
	 * 
	 * @param request
	 * @param c
	 * @param jsonString
	 * @return
	 * @deprecated
	 */
	@Deprecated
	public static List<Object> getEntityList(HttpServletRequest request,
			Class<?> c, String jsonString) {
		List<Object> list = new ArrayList<Object>();
		jsonString = jsonString.replace(",\"undefined\":\"\"", "");
		JSONArray jsonarray = new JSONArray();
		jsonarray = JSONArray.fromObject(jsonString);
		for (int i = 0; i < jsonarray.size(); i++) {
			JSONObject js = jsonarray.getJSONObject(i);// 根据字符串转换对象
			Object bean = JSONObject.toBean(js, c); // 把值绑定成相应的值对象
			list.add(bean);
		}
		return list; // 返回对象
	}

	/**
	 * 
	 * @param m
	 * @param entityObj
	 * @param parameter
	 * @throws Exception
	 * @deprecated
	 */
	@Deprecated
	private static void setValue2Method(Method m, Object entityObj,
			String parameter) throws Exception {

		if (m.getParameterTypes()[0].getSimpleName().equals("int")||m.getParameterTypes()[0].getSimpleName().equals("Integer")) { // 如果参数类型是int型的
			if (!parameter.equals("")) {
				m.invoke(entityObj, Integer.parseInt(parameter)); // 执行set方法，将参数设为Int型
			}
		} else if (m.getParameterTypes()[0].getSimpleName().equals("double")) {// 如果参数类型是Double型的
			if (!parameter.equals("")) {
				m.invoke(entityObj, Double.parseDouble(parameter));// 执行set方法
			}
		} else if (m.getParameterTypes()[0].getSimpleName().equals("String")) { // 如果参数类型是String型的
			if (parameter != null) {
				m.invoke(entityObj, parameter);// 执行set方法
			}
		} else if (m.getParameterTypes()[0].getSimpleName().equals("Date")) { // 如果参数类型是String型的
			if (parameter != null) {
				m.invoke(entityObj, DatetimeUtil.formatString(parameter,
						Constant.DATEFORMAT));// 执行set方法
			}
		}
	}
	
	private static void toDBMap4Oracle(HashMap<String, String> result, String paramName, String nameObject) {
		if(nameObject.trim().indexOf(" ")>0)
		{
			//result.put(paramName, "to_date('"+nameObject.trim()+"','yyyy-mm-dd hh24:mi:ss')");
			
			
			result.put(paramName, nameObject.trim());
			
		}
		else
		{
			
			if(paramName.endsWith("_start"))
			{
				//result.put(paramName, "to_date('"+nameObject.trim()+" 00:00:00','yyyy-mm-dd hh24:mi:ss')");
				//result.put(paramName, nameObject.trim()+"");
				result.put(paramName, "to_date('"+nameObject.trim()+"','yyyy-mm-dd')") ;//   nameObject.trim().replace(oldChar, newChar)+"");
				
			}
			else
			{
				//result.put(paramName, "to_date('"+nameObject.trim()+" 23:59:59','yyyy-mm-dd hh24:mi:ss')");
				//result.put(paramName, nameObject.trim()+"");
				result.put(paramName, "to_date('"+nameObject.trim()+"','yyyy-mm-dd')") ;
			}
		}
	}
}
